package ar.uba.fi.tecnicas.testing;

import java.util.ArrayList;
import java.util.List;

import ar.uba.fi.tecnicas.fabrica.*;
import ar.uba.fi.tecnicas.juego.Jugador;
import ar.uba.fi.tecnicas.testing.mock.ConfiguracionTipoMateriaPrimaMock;
import junit.framework.TestCase;

public class MercadoTest extends TestCase 
{
	private TipoMateriaPrima azucar = ConfiguracionTipoMateriaPrimaMock.instance.getItem("Azucar");
	private TipoMateriaPrima arroz = ConfiguracionTipoMateriaPrimaMock.instance.getItem("Arroz");
	private TipoMateriaPrima harina = ConfiguracionTipoMateriaPrimaMock.instance.getItem("Harina");

	public void setUp() 
	{
		Mercado.instancia.nuevoTipoMateriaPrima(azucar);
		Mercado.instancia.nuevoTipoMateriaPrima(arroz);
		Mercado.instancia.nuevoTipoMateriaPrima(harina);
	}

	public void testCantidadProductoMercado()
	{
		int cantElementos = Mercado.instancia.getTiposMateriaPrima().size();
		assertEquals(3, cantElementos);
	}
	
	public void testObtenerProductosEnPrecio()
	{
		List<TipoMateriaPrima> productos = Mercado.instancia.getTiposMateriaPrimaEnPrecio(2.0);
		assertEquals(2, productos.size());
	}
	
	public void testObtenerPrecioProducto()
	{
		assertEquals(1.5, Mercado.instancia.getTipoMateriaPrima(arroz.getNombre()).getPrecio(), 0.0);
	}
	
	public void testEfectuarCompra()
	{
		List<MateriaPrima> compras = new ArrayList<MateriaPrima>();

		double cantidadAzucar = 2.0;
		double cantidadHarina = 5.0;

		double cantidad;
		
		try {
			compras.add(new MateriaPrima(azucar, cantidadAzucar));
			compras.add(new MateriaPrima(harina, cantidadHarina));

			Almacen.instancia.agregarNuevaMateriaPrima(new MateriaPrima(azucar, 5));
			
			Mercado.instancia.efectuarCompra(compras);
		} 
		catch (Exception e) {}
		
		cantidad = Almacen.instancia.getMateriaPrima(azucar).getCantidad();
		
		assertEquals(7.0,cantidad,0);
	}
	
	public void testExisteDineroParaCompra()
	{
		List<MateriaPrima> compras = new ArrayList<MateriaPrima>();
		
		Jugador jugador = new Jugador("J", 30);

		try {
			compras.add(new MateriaPrima(azucar, 2.0));
			compras.add(new MateriaPrima(harina, 5.0));

			Mercado.instancia.efectuarCompra(compras);
		} 
		catch (Exception e) 
		{
			
		}
		
		assertTrue(jugador.getCapital() >= 0);
		
	}
	
	public void tearDown() 
	{
		Mercado.instancia.getTiposMateriaPrima().clear();
		Almacen.instancia.getMateriasPrimas().clear();
	}	
}
